package com.sftz.modules.minapp.courseCollection.service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.SqlManager;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.log.Log;
import org.nutz.log.Logs;

import com.google.common.collect.Maps;
import com.sftz.assets.entities.CourseCollectTabEntity;
import com.sftz.assets.enums.CollecStateEunm;
import com.sftz.modules.minapp.courseCollection.dto.CollerctDto;
import com.sftz.modules.minapp.courseCollection.form.CollectForm;
import com.sftz.modules.minapp.user.cache.RedissionUserCache;
import com.uxuexi.core.common.util.EnumUtil;
import com.uxuexi.core.common.util.Util;
import com.uxuexi.core.db.dao.IDbDao;
import com.uxuexi.core.db.util.DbSqlUtil;

/**
 * 我的收藏 课程列表
 * @author   王宏伟
 * @Date	 2018年12月11日
 */
@IocBean
public class CollectService {
	private static final Log log = Logs.get();
	@Inject
	protected IDbDao dbDao;
	@Inject
	protected Dao nutDao;
	@Inject
	protected SqlManager sqlManager;

	/**
	 * 列表
	 * @author	王宏伟
	 * @Date	2018年12月18日
	 */
	public Map<String, Object> courseCollectList(CollectForm form) {
		String token = form.getToken();
		Integer userId = RedissionUserCache.getUserId(token);
		//测试使用userId
		//userId = 1;
		Integer pageNumber = form.getPageNumber();
		Integer pageSize = form.getPageSize();
		int pageNum = (pageNumber - 1) * pageSize;
		Sql sql = Sqls.create(sqlManager.get("minapp_collect_list"));
		sql.setParam("userId", userId);
		sql.setParam("pageNumber", pageNum);
		sql.setParam("pageSize", pageSize);
		List<CollerctDto> courseLst = DbSqlUtil.query(dbDao, CollerctDto.class, sql);
		//获取总条数
		Sql countSql = Sqls.create(sqlManager.get("minapp_collect_list_count"));
		countSql.setParam("userId", userId);
		CollerctDto dto = DbSqlUtil.fetchEntity(dbDao, CollerctDto.class, countSql);
		Integer count = dto.getCount();

		Map<String, Object> map = Maps.newHashMap();
		map.put("collectList", courseLst);
		map.put("pageNumber", pageNumber);
		map.put("pageSize", pageSize);
		map.put("count", count);
		map.put("pageNum", pageNum);
		return map;
	}

	/**
	 * 删除加入一条数据
	 * @author	王宏伟
	 * @Date	2018年12月18日
	 */
	@Aop("txDb")
	public Object cancelCollection(CollectForm form) throws ParseException {
		String token = form.getToken();
		Integer userId = RedissionUserCache.getUserId(token);
		//测试使用userId
		//userId = 1;
		Integer courseId = form.getCourseId();
		//进行取消点赞
		//已收藏更新为未收藏 修改收藏时间
		SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		dbDao.update(
				CourseCollectTabEntity.class,
				Chain.make("collecState", CollecStateEunm.COLLECTNO.intKey()).add("collecTime", dfs.format(new Date())),
				Cnd.where("createById", "=", userId).and("collecId", "=", courseId).and("collecType", "=", 1));
		//获取当前页第最后一条数据（因为删除当前页的任意一条数据，查询数据表，最后一条是第二页的第一条移动到第一页的最后一条）
		Integer pageNumber = form.getPageNumber();
		Integer pageSize = form.getPageSize();
		int pageNum = pageNumber * pageSize - 1;
		Integer onePageNumber = 1;
		Sql sql = Sqls.create(sqlManager.get("minapp_collect_list"));
		sql.setParam("userId", userId);
		sql.setParam("pageNumber", pageNum);
		sql.setParam("pageSize", onePageNumber);
		CollerctDto oneCollerctData = DbSqlUtil.fetchEntity(dbDao, CollerctDto.class, sql);
		return oneCollerctData;
	}

	/*************************以下是收藏使用的接口*******************************/

	/**
	 * 添加、取消 收藏
	 * @author	王宏伟
	 * @throws ParseException 
	 * @Date	2018年12月12日
	 */
	@Aop("txDb")
	public void collection(CollectForm form) throws ParseException {
		Integer courseId = form.getCourseId();
		String token = form.getToken();
		Integer userId = RedissionUserCache.getUserId(token);
		//判断有无课程收藏数据
		boolean collectionStatus = worksCollectView(courseId, userId);
		if (collectionStatus) {
			//有数据 判断 收藏状态
			if (!Util.isEmpty(userId) && !Util.isEmpty(courseId)) {
				CourseCollectTabEntity collectTab = dbDao.fetch(CourseCollectTabEntity.class,
						Cnd.where("createById", "=", userId).and("collecId", "=", courseId).and("collecType", "=", 1));
				Integer collecState = collectTab.getCollecState();
				CollecStateEunm cs = EnumUtil.get(CollecStateEunm.class, collecState);
				switch (cs) {
				case COLLECTYES:
					//已收藏更新为未收藏 修改收藏时间\
					SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
					dbDao.update(
							CourseCollectTabEntity.class,
							Chain.make("collecState", CollecStateEunm.COLLECTNO.intKey()).add("collecTime",
									dfs.format(new Date())),
							Cnd.where("createById", "=", userId).and("collecId", "=", courseId)
									.and("collecType", "=", 1));
					break;
				case COLLECTNO:
					//未收藏更新为已收藏 修改收藏时间
					SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
					dbDao.update(
							CourseCollectTabEntity.class,
							Chain.make("collecState", CollecStateEunm.COLLECTYES.intKey()).add("collecTime",
									df.format(new Date())),
							Cnd.where("createById", "=", userId).and("collecId", "=", courseId));
					break;

				default:
					break;
				}
			}
		} else {
			//无数据添加收藏
			insterCollect(courseId, userId);
		}
	}

	/**
	 * 添加課程收藏
	 * @author	王宏伟
	 * @throws ParseException 
	 * @Date	2018年12月12日
	 */
	@Aop("txDb")
	public int insterCollect(Integer courseId, Integer userId) throws ParseException {
		if (!Util.isEmpty(userId) && !Util.isEmpty(courseId)) {
			SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Date date = dfs.parse(dfs.format(new Date()));
			CourseCollectTabEntity newCollectTabEntity = new CourseCollectTabEntity();
			newCollectTabEntity.setCollecId(courseId);
			newCollectTabEntity.setCollecState(CollecStateEunm.COLLECTYES.intKey());
			newCollectTabEntity.setCollecType(1);
			newCollectTabEntity.setCreateById(userId);
			newCollectTabEntity.setCollecTime(date);
			CourseCollectTabEntity insert = dbDao.insert(newCollectTabEntity);
			int collectId = insert.getId();
			return collectId;
		}
		int i = 0;
		return i;
	}

	/**
	 * 判断该用户是否有收藏课程：true:收藏,false:没收藏
	 * @author	王宏伟
	 * @Date	2018年12月12日
	 */
	public boolean worksCollectView(Integer courseId, Integer userId) {
		CourseCollectTabEntity collectTab = null;
		if (!Util.isEmpty(userId) && !Util.isEmpty(courseId)) {
			collectTab = dbDao.fetch(
					CourseCollectTabEntity.class,
					Cnd.where("collecId", "=", courseId).and("createById", "=", userId).and("collecType", "=", 1)
							.and("collecState", "=", 1));
		}
		if (!Util.isEmpty(collectTab)) {
			return true;
		}
		return false;
	}

	/**
	 * 查询用户对这门课程收藏的状态
	 * @author	王宏伟
	 * @Date	2018年12月12日
	 */
	public CourseCollectTabEntity collectionStatus(CollectForm form) {
		Integer courseId = form.getCourseId();
		String token = form.getToken();
		Integer userId = RedissionUserCache.getUserId(token);
		CourseCollectTabEntity collectTab = null;
		if (!Util.isEmpty(userId) && !Util.isEmpty(courseId)) {
			collectTab = dbDao.fetch(CourseCollectTabEntity.class,
					Cnd.where("collecId", "=", courseId).and("createById", "=", userId).and("collecType", "=", 1));
			return collectTab;
		} else {
			log.info("courseId=" + courseId + ";userId=" + userId);
			return collectTab;
		}
	}

}
